#ifndef _STRU_QUEUE_H_
#define _STRU_QUEUE_H_

#include "common.h"

/** 是否开启 队列 DEBUG模式 **/
// #define QUEUE_DEBUG 

#ifndef _LOG_DEBUG_
#define LOG_DEBUG(...)     printf(__VA_ARGS__)
#endif


#define QU_FREE         0           //空闲状态
#define QU_BUSY         1           //忙碌状态的

#define QU_OPTI         0x00        //光纤
#define QU_VALN         0x01        //网口
/*************************无序队列********************************/
typedef struct {
    uint8 type;                           //网口和光纤的类型
    uint8 *rbuf;                          //buf
    uint32 blen;                          //rbuf的长度
    uint32 qlen;                          //rbuf的有效数据, 用于处理网口过来的数据
    uint32 channel;                       //通道号
    volatile uint32 flag;                          //0.空闲状态  1.忙碌状态
    struct BQueue *next;                  //下一个
} BQueue;

typedef struct {
    BQueue * bQueue;
    uint32 bNum;                        //bnum 个数
    uint32 exNum;                      //自动扩容个数
    uint32 blen;
    pthread_mutex_t lock_free_t;
} __attribute__((packed)) BQueueBox;  //pthread_mutex_t 这里要内存对齐,不然加锁的时候会导致内存越界访问

BQueueBox * createBQueue(int bsize, int bNum, int exNUM);
BQueue * mallocBQueue(BQueueBox *bQuBox);
BQueue * freeBQueue(BQueue * bQueue);
int verifyQBoxLen(BQueueBox *bQuBox);
int destroyBQueue(BQueueBox * bQueBox);
int getBusyNumBQueue(BQueue * queue);
void test_queue_main();

/*************************有序队列********************************/
void test_queue_FIFO();

typedef struct {
    BQueue *data;
    struct OrderQueue *next;  
} OrderQueue;
typedef struct {
    OrderQueue *head;  //头指针
    OrderQueue *end;   //尾指针
    OrderQueue *flag;  //记住申请的地址, 便于释放
    int num;           //队列个数 
} OrderQueueBox;
OrderQueueBox * createOrderQueue(int num);
int inputOrderQueueEle(OrderQueueBox *orderQBox, BQueue *bQueue);
BQueue *outputOrderQueueEle(OrderQueueBox *orderQBox);
int destoryOrderQueue(OrderQueueBox *oqBox);
int getUsedNumOrderBQue(OrderQueueBox *oqBox);
void verifyOrderQueue(OrderQueueBox *oqBox, int times);

#endif
